package com.myblog.controller;

import com.myblog.common.lang.Result;
import org.springframework.http.HttpRequest;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@RestController
public class FileController {

    @PostMapping("/upload")
    public Result SingleFileUpLoad(@RequestParam("myfile") MultipartFile file){
        //判断文件是否为空
        if(file.isEmpty()){
            return Result.fail("上传文件为空！");
        }

        //创建输入输出流
        InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            //指定上传的位置为 d:/upload/
            //String path = "./ulFiles/img/avatar/";
            String path = "/home/myProjects/YumWebsite/pictures/";
            //获取文件的输入流
            inputStream = file.getInputStream();
            //获取上传时的文件名
            String fileName = file.getOriginalFilename();
            //注意是路径+文件名
            File targetFile = new File(path + fileName);
            //如果之前的 String path = "d:/upload/" 没有在最后加 / ，那就要在 path 后面 + "/"

            //判断文件父目录是否存在
            if(!targetFile.getParentFile().exists()){
                //不存在就创建一个
                targetFile.getParentFile().mkdir();
            }

            //获取文件的输出流
            outputStream = new FileOutputStream(targetFile);
            //最后使用资源访问器FileCopyUtils的copy方法拷贝文件
            FileCopyUtils.copy(inputStream, outputStream);
            /*参数是通过源码
                public static int copy(InputStream in, OutputStream out) throws IOException {
                    ......
                }
           而得知的*/

            //告诉页面上传成功了
            // 为什么 AbsolutePath 会把点也打出来呢？？？因为，其底层就是 把 path 和 当前路径进行拼接！所以 path 要写对！
            return Result.succ(fileName);

        } catch (IOException e) {
            e.printStackTrace();
            //出现异常，则告诉页面失败
            return Result.fail("上传失败！");
        } finally {
            //无论成功与否，都要关闭输入输出流
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @PostMapping("/uploadMul")
    public Result MultiFileUpload(HttpServletRequest request){

        List<MultipartFile> fileList = ((MultipartHttpServletRequest)request).getFiles("myFiles");

        //创建输入输出流
        InputStream inputStream = null;
        OutputStream outputStream = null;

        //指定上传的位置为 d:/upload/  -- /myProjects/yumwebsite
        //String path = "./ulFiles/img/avatar/";
        String path = "/home/myProjects/YumWebsite/pictures/";

        for(MultipartFile curFile : fileList){

            try {
                //获取文件的输入流
                inputStream = curFile.getInputStream();
                //获取上传时的文件名
                String fileName = curFile.getOriginalFilename();
                //注意是路径+文件名
                File targetFile = new File(path + fileName);
                //如果之前的 String path = "d:/upload/" 没有在最后加 / ，那就要在 path 后面 + "/"

                //判断文件父目录是否存在
                if(!targetFile.getParentFile().exists()){
                    //不存在就创建一个
                    targetFile.getParentFile().mkdir();
                }

                //获取文件的输出流
                outputStream = new FileOutputStream(targetFile);
                //最后使用资源访问器FileCopyUtils的copy方法拷贝文件
                FileCopyUtils.copy(inputStream, outputStream);

            } catch (IOException e) {
                e.printStackTrace();
                //出现异常，则告诉页面失败
                return Result.fail("上传失败！");
            }
        }

        //无论成功与否，都要关闭输入输出流
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return Result.succ("上传多个文件成功！");
    }

}



